package com.vehiclemanagement.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.vehiclemanagement.entity.MaintenanceRecord;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 车辆维修保养记录服务接口
 */
public interface MaintenanceRecordService extends IService<MaintenanceRecord> {

    /**
     * 分页查询维修保养记录
     *
     * @param current          当前页
     * @param size             每页大小
     * @param searchTerm       搜索关键词
     * @param vehicleId        车辆ID
     * @param maintenanceType  维修保养类型
     * @param status           状态
     * @param startTime        开始时间
     * @param endTime          结束时间
     * @return 分页结果
     */
    IPage<MaintenanceRecord> pageMaintenanceRecords(Integer current, Integer size, String searchTerm,
                                                  Long vehicleId, Integer maintenanceType, Integer status,
                                                  LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 根据ID获取维修保养记录详情
     *
     * @param id 记录ID
     * @return 维修保养记录详情
     */
    MaintenanceRecord getMaintenanceRecordById(Long id);

    /**
     * 添加维修保养记录
     *
     * @param record 维修保养记录
     * @return 是否成功
     */
    boolean addMaintenanceRecord(MaintenanceRecord record);

    /**
     * 更新维修保养记录
     *
     * @param record 维修保养记录
     * @return 是否成功
     */
    boolean updateMaintenanceRecord(MaintenanceRecord record);

    /**
     * 删除维修保养记录
     *
     * @param id 记录ID
     * @return 是否成功
     */
    boolean deleteMaintenanceRecord(Long id);

    /**
     * 开始维修保养
     *
     * @param id 记录ID
     * @return 是否成功
     */
    boolean startMaintenance(Long id);

    /**
     * 完成维修保养
     *
     * @param id 记录ID
     * @param endTime 结束时间
     * @param maintenanceCost 维修保养费用
     * @param partsCost 零部件费用
     * @param laborCost 人工费用
     * @param isInsuranceClaim 是否保险理赔
     * @param insuranceClaimAmount 保险理赔金额
     * @param remark 备注
     * @return 是否成功
     */
    boolean completeMaintenance(Long id, LocalDateTime endTime, BigDecimal maintenanceCost, 
                              BigDecimal partsCost, BigDecimal laborCost, Integer isInsuranceClaim, 
                              BigDecimal insuranceClaimAmount, String remark);

    /**
     * 取消维修保养
     *
     * @param id 记录ID
     * @param remark 取消原因
     * @return 是否成功
     */
    boolean cancelMaintenance(Long id, String remark);

    /**
     * 计算总费用
     *
     * @param maintenanceCost 维修保养费用
     * @param partsCost 零部件费用
     * @param laborCost 人工费用
     * @return 总费用
     */
    BigDecimal calculateTotalCost(BigDecimal maintenanceCost, BigDecimal partsCost, BigDecimal laborCost);

    /**
     * 计算实际支出（总费用-保险理赔金额）
     *
     * @param totalCost 总费用
     * @param insuranceClaimAmount 保险理赔金额
     * @return 实际支出
     */
    BigDecimal calculateActualCost(BigDecimal totalCost, BigDecimal insuranceClaimAmount);

    /**
     * 获取指定车辆的维修保养总费用
     *
     * @param vehicleId 车辆ID
     * @return 维修保养总费用
     */
    BigDecimal sumTotalCostByVehicleId(Long vehicleId);

    /**
     * 获取指定车辆的维修保养实际支出总费用
     *
     * @param vehicleId 车辆ID
     * @return 实际支出总费用
     */
    BigDecimal sumActualCostByVehicleId(Long vehicleId);

    /**
     * 获取指定车辆的维修保养次数
     *
     * @param vehicleId 车辆ID
     * @return 维修保养次数
     */
    Integer countMaintenanceByVehicleId(Long vehicleId);

    /**
     * 按维修保养类型统计
     *
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 按类型统计的结果
     */
    List<Map<String, Object>> statisticsByType(LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 按月份统计维修保养费用
     *
     * @param year 年份
     * @return 月度统计结果
     */
    List<Map<String, Object>> statisticsByMonth(Integer year);

    /**
     * 查询即将到期需要保养的车辆
     *
     * @param mileageThreshold 里程数阈值
     * @return 需要保养的车辆列表
     */
    List<Map<String, Object>> findVehiclesNeedingMaintenance(Double mileageThreshold);
} 